package cabinet

// BaseInfo 协议头信息
type BaseInfo struct {
	Head   uint16 // 帧头：2字节，固定为0x3B、0xB3
	Des    uint8  // 目的地址：1字节，为帧发送的目的地址
	Source uint8  // 源地址：1字节，产生帧的设备地址
	Type   uint8  // 上位发送固定为0x00, 控制板发送固定为0x01
	Id     uint8  // 由上位机产生，每发一帧数据流水累加1
	Cmd    uint8  // 标识不同的功能
	Length uint16 // 为数据的长度，最大4096
}

// EndInfo 协议尾信息
type EndInfo struct {
	Crc16 uint16
}

type CommonData struct {
	BaseInfo
	D []byte
	EndInfo
}

// OpenDoorInfo 开仓门命令
type OpenDoorInfo struct {
	ChannelNo uint8 // 仓控板地址
	Number    uint8 // 开门流水号
}

// CabSum 设置仓门数量
type CabSum struct {
	Sum uint8 // 仓门数量
}

// StatusInfo 换电柜状态
type StatusInfo struct {
	BaseInfo
	Result uint8
	SensorStatus
	Parameter
	Small [12]SmallStatus
	EndInfo
}

// SensorStatus 设备传感器状态
type SensorStatus struct {
	MaintainDoor uint8 `json:"maintain_door"` // 维修门状态 0x00：关闭   0x01：打开
	Lightning    uint8 `json:"lightning"`     // 雷击状态 0x00：正常     0x01：雷击
	Fire         uint8 `json:"fire"`          // 消防状态 0x00：正常     0x01：报警
	Smoke        uint8 `json:"smoke"`         // 烟感状态 0x00：无烟     0x01：有烟
	Water        uint8 `json:"water"`         // 水浸状态 0x00：无水浸   0x01：有水浸
	UrgencyStop  uint8 `json:"urgency_stop"`  // 急停状态 0x00：正常状态  0x01：急停状态
}

// Parameter 设备电参数
type Parameter struct {
	T  uint8   `json:"t"`  // 温度 单位摄氏度，最大127度
	Ta uint8   `json:"ta"` // 电表在线 0x00：离线   0x01：在线
	V  float32 `json:"v"`  // 电压 单精度浮点型
	I  float32 `json:"i"`  // 电流 单精度浮点型
	P  float32 `json:"p"`  // 功率 单精度浮点型
	E  float32 `json:"e"`  // 总电量 单精度浮点型
	Pf float32 `json:"pf"` // 功率因数  单精度浮点型
}

// SmallStatus 分板状态
type SmallStatus struct {
	Online        uint8     `json:"online"`         // 仓控板在线状态	0x00：离线   0x01：在线
	Door          uint8     `json:"door"`           // 仓门状态		0x00：关闭   0x01：打开
	BatteryP      uint8     `json:"battery_p"`      // 电池在位状态	0x00：无电池  0x01：有电池
	OutFire       uint8     `json:"out_fire"`       // 灭火器状态		0x00：无动作   0x01：灭火中
	Urgency       uint8     `json:"urgency"`        // 紧急状态		0x00：正常状态   0x01：紧急状态
	Tem           uint8     `json:"tem"`            // 温度			有符号数，单位摄氏度，最大127度
	BatteryV      uint16    `json:"battery_v"`      // 电池电压		除以100
	ChargeOnline  uint8     `json:"charge_online"`  // 充电器在线状态	0x00：离线   0x01：在线
	ChargeV       uint16    `json:"charge_v"`       // 充电电压 除以10
	ChargeI       uint16    `json:"charge_i"`       // 充电电流 除以100
	ChargerStatus uint16    `json:"charger_status"` // 充电状态 目前使用0~7位， 0~3bit：status 0:空闲 1:正在开机 2:充电中 3:充满电  4:限额充电
	BmsOnline     uint8     `json:"bms_online"`     // BMS在线状态
	BmsId         [26]uint8 `json:"bms_id"`         // BMS ID
	BmsIo         [7]uint8  `json:"bms_io"`         // BMS开关量
	BmsAnalog     [58]uint8 `json:"bms_analog"`     // BMS模拟量
}

// 命令
const (
	CmdOpenDoor      uint8 = 0xA1 //
	CmdSetCabinetSum uint8 = 0xA2 //
	CmdReadStatus    uint8 = 0xA3 //
	CmdStartCharge   uint8 = 0xA7 //
	CmdStopCharge    uint8 = 0xA8 //
	CmdReadCardNo    uint8 = 0xad //
)
